#pragma once
#include <string>
#include <unordered_map>

namespace rpc
{
    #define KEY_METHOD     "method"
    #define KEY_PARAMS     "parameters"
    #define KEY_TOPIC_KEY  "topic_key"//主题名称
    #define KEY_TOPIC_MSG  "topic_msg"//主题消息
    #define KEY_OPTYPE     "optype"
    #define KEY_RCODE      "rcode"
    #define KEY_HOST       "host"
    #define KEY_IP         "ip"
    #define KEY_PORT       "port"
    #define KEY_RESULT     "result"
    //Mtype
    // 包含Rpc请求响应
    // 主题请求响应，包括主题创建，删除，发布，订阅等
    // 服务操作请求和响应，包括服务上线下线
    enum class Mtype{//表示消息的类型
        REQ_RPC = 0,
        RSP_RPC,
        REQ_TOPIC,
        RSP_TOPIC = 10,
        REQ_SERVICE,
        RSP_SERVICE,
    };
    enum class Rcode{
        RCODE_OK = 0,
        RCODE_ERR_MSGTYPE,
        RCODE_PARSE_FAILED,
        RCODE_DISCONNECTED,//链接断开
        RCODE_INVALID_MSG,
        RCODE_INVALID_PARAMS,
        RCODE_INVALID_OPTYPE,
        RCODE_NOT_FOUND_SERVICE,
        RCODE_NOT_FOUND_TOPIC,
        RCODE_INTERNAL_ERROR//服务器内部错误
    };

    static std::string errReason(Rcode code) {
        static std::unordered_map<Rcode, std::string> err_map = {
            {Rcode::RCODE_OK, "成功处理！"},
            {Rcode::RCODE_PARSE_FAILED, "消息解析失败！"},
            {Rcode::RCODE_ERR_MSGTYPE, "消息类型错误！"},
            {Rcode::RCODE_INVALID_MSG, "无效消息"},
            {Rcode::RCODE_DISCONNECTED, "连接已断开！"},
            {Rcode::RCODE_INVALID_PARAMS, "无效的Rpc参数！"},
            {Rcode::RCODE_NOT_FOUND_SERVICE, "没有找到对应的服务！"},
            {Rcode::RCODE_INVALID_OPTYPE, "无效的操作类型"},
            {Rcode::RCODE_NOT_FOUND_TOPIC, "没有找到对应的主题！"},
            {Rcode::RCODE_INTERNAL_ERROR, "内部错误！"}
        };
        auto it = err_map.find(code);
        if (it == err_map.end()) {
            return "未知错误！";
        }
        return it->second;
    }

    
    enum class Rtype{//请求类型，同步请求还是异步请求
        REQ_ASYNC = 0,
        REQ_CALLBACK//请求模式标识符，通常用于需要回调函数的异步请求
    };
    enum class TopicOptype{//主题操作类型
        TOPIC_CREATE = 0,
        TOPIC_REMOVE,
        TOPIC_SUBSCRIBE,
        TOPIC_CANCLE,
        TOPIC_PUBLISH
    };
    enum class ServiceOptype{//服务操作类型
        SERVICE_REGISTRY = 0,
        SERVICE_DISCOVERY,
        SERVICE_ONLINE,
        SERVICE_OFFLINE,
        SERVICE_UNKNOW
    };
}